package com.briup.jd2511.jd2511bookstore.proxy.jdk;


import com.briup.jd2511.jd2511bookstore.proxy.Singer;
import com.briup.jd2511.jd2511bookstore.proxy.Target;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

//JDK动态代理测试
public class JDKProxyTest {
    public static void main(String[] args) {
        //1.创建目标类对象
        Singer target = new Target();

        //2.获取目标类的类加载器
        ClassLoader loader = Target.class.getClassLoader();

        //3.获取目标类所实现的所有接口
        Class<?>[] interfaces = Target.class.getInterfaces();

        //4.新建InvocationHandler接口的实现类对象【可理解其内部会重写核心方法】
        InvocationHandler h = (proxy, method, args1) -> {

            System.out.println("安排时间");
            System.out.println("联系场地");
            System.out.println("安全保障");
            System.out.println("合同签订");

            //目标类核心功能实现
            //借助反射技术实现：method是方法对象，target是目标对象，args是参数对象列表
            //     等同执行：target.method(args);
            Object result = method.invoke(target, args1);

            System.out.println("费用结算");

            //返回核心方法的运行结果
            return result;
        };

        //5.获取代理对象，并借助代理对象实现最终功能：调用重写的sing方法即可
        Singer proxy = (Singer) Proxy.newProxyInstance(loader, interfaces, h);
        //proxy对象将代理target对象中的sing
        //在完成真正的sing功能之前和之后，会完成一些额外的功能
        proxy.sing();

        //6.观察代理对象真正的类型是什么
        System.out.println("代理对象proxy真实类型："+proxy.getClass());
    }
}
